package edu.hebeu.fragment.main;

import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;

import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView;

import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import edu.hebeu.R;
import edu.hebeu.fragment.BaseFragment;
import edu.hebeu.activity.LoginActivity;
import edu.hebeu.adapters.CarAdapter;
import edu.hebeu.entity.CodeAndMsgResponse;
import edu.hebeu.network.API;
import edu.hebeu.network.APIConfig;
import edu.hebeu.network.MyCallback;
import edu.hebeu.util.DateUtil;

public class CarFragment extends BaseFragment {

    private static String TAG = "CartFragment";

    private List<String[]> data; // 数据
    private RecyclerView recycler_view;
    private TextView tv_total_money;
    private Button btn_account;
    private CarAdapter adapter; // 声明适配器对象

    private int totalAccountmoney; // 总计金额

    private boolean requestSuccess = true; // 这个变量用来保存请求是否成功，以决定是否删除购物车的内容

    public CarFragment() {
    }

    @Override
    protected int getLayoutId() {
        return R.layout.fragment_car;
    }

    @Override
    protected void initViews() {
        recycler_view = (RecyclerView) findViewByIdF(R.id.recycler_view);
        tv_total_money = (TextView) findViewByIdF(R.id.tv_total_money);
        btn_account = (Button) findViewByIdF(R.id.btn_account);
        data = new ArrayList<>();
        getData();

    }

    /**
     * 当启动这个Fragment时
     */
    @Override
    public void onStart() {
        super.onStart();
        data.clear(); // 清空集合内的数据
        getData();
    }

    @Override
    public void onResume() {
        super.onResume();
        data.clear(); // 清空集合内的数据
        getData();
    }

    /**
     * 获取数据的方法(通过SQLite数据库获取)
     */
    private void getData() {
        this.data = getDAO().query();
        show(data);
    }

    /**
     * 显示的方法(设置布局管理器和适配器)
     * @param data
     */
    private void show(List<String[]> data) {
        // RecyclerView需要设置样式(其实就是设置布局管理器)
        LinearLayoutManager layoutManager = new LinearLayoutManager(context); // 实例化布局管理器对象
        layoutManager.setOrientation(LinearLayoutManager.VERTICAL); // 设置该布局管理器垂直
        layoutManager.setReverseLayout(false); // 设置不反转

        recycler_view.setLayoutManager(layoutManager); // 设置布局管理器

        adapter = new CarAdapter(data); // 创建适配器对象实例
        recycler_view.setAdapter(adapter); // 设置布局管理器

        initListeners(); // 调用初始化监听器的方法
    }

    /**
     * 这个方法用来初始化监听器
     */
    private void initListeners() {
        adapter.setOnTrashClickListener(new CarAdapter.OnTrashClickListener() { // 垃圾桶图标被点击的监听器
            @Override
            public void onTrashClick(String goodId) {
                getDAO().delete(goodId);
                data.clear(); // 清除data内的数据
                getData();
                showToast("删除选购商品成功！", 0, false);
                if (data.size() == 0) { // 如果购物车内的商品没有了
                    tv_total_money.setText("总计：￥"); // 将该内容赋值到文本框上
                }
            }
        });
        adapter.setTextChangedListener(new CarAdapter.TextChangedListener() { // 文本框改变的监听器
            @Override
            public void textChanged(String[] carItem, Integer accountMoney) {
                totalAccountmoney = accountMoney;
                tv_total_money.setText("总计：￥" + totalAccountmoney); // 将重新计算的总金额汇总更新到文本框上
            }
        });
        btn_account.setOnClickListener(new View.OnClickListener() { // 支付按钮被点击的监听器
            @Override
            public void onClick(View v) {
                if (data.size() > 0) { // 当购物城内的商品大于0(即有商品)
                    payment(); // 调用支付方法
                }
            }
        });
    }

    /**
     * 该方法用来处理支付操作
     */
    private void payment() {
        Date now = new Date(); // 创建日期对象
        String username = (String) getSPFile("username", "");
        String orderCode = DateUtil.formDate("yyyyMMddHHmmss", now) + username;
//        showToast("创建订单：" + orderCode, 2, false);

        final Map<String, Object> createOrderParam = new HashMap<>();
        createOrderParam.put("code", orderCode);
        createOrderParam.put("user_username", username);
        createOrderParam.put("time", DateUtil.formDate("yyyy-MM-dd HH:mm:ss", now)); // 2021-04-01 12:48:50
        createOrderParam.put("amount", totalAccountmoney);
        requestAddOrder(createOrderParam);// 调用发起创建订单的网络请求

            try {
                Thread.sleep(1000); // 为了保证订单已经插入数据库，让线程睡眠1秒，先不要执行下面的网络请求(下面的网络请求会以上面的订单作为主键)
            } catch (InterruptedException e) {
                e.printStackTrace();
            }

        for (String[] carItem : data) { // 遍历购物车内所有的商品

            Map<String, Object> createOrderListParam = new HashMap<>();
            createOrderListParam.put("order_code", orderCode);
            createOrderListParam.put("goods_id", carItem[0]);
            createOrderListParam.put("goodsprice", Integer.parseInt(carItem[4]) * Integer.parseInt(carItem[3]));
            createOrderListParam.put("goodscount", carItem[3]);
            createOrderListParam.put("price", carItem[4]);
            requestAddOrderList(createOrderListParam); // 调用发起创建订单明细的网络请求

            Map<String, Object> updateGoodParam = new HashMap<>();
            updateGoodParam.put("id", carItem[0]);
            updateGoodParam.put("name", carItem[1]);
            updateGoodParam.put("describe", carItem[7]);
            updateGoodParam.put("price", carItem[4]);
            updateGoodParam.put("store", Integer.parseInt(carItem[2]) - Integer.parseInt(carItem[3]));
            updateGoodParam.put("src", carItem[6]);
            updateGoodParam.put("goods_category_id", carItem[9]);
            updateGoodParam.put("index", carItem[8]);
            requestUpdateGood(updateGoodParam); // 调用发起修改商品信息的请求

            if (requestSuccess) {
                getDAO().delete(carItem[0]); // 从SQLite数据库(购物城后台)清除此商品
            }
        }
        data.clear(); // 清空存放购物车商品的容器
        getData(); // 重新去SQLite数据库获取数据
        if (data.size() == 0) { // 如果购物车内的商品没有了
            tv_total_money.setText("总计：￥"); // 将该内容赋值到文本框上
        }
    }

    /**
     * 该方法用来发起创建订单请求
     */
    private void requestAddOrder(final Map<String, Object> params) {

        final String token = (String) getSPFile("token", "");
        API.requestConfig(APIConfig.URL.CREATE_ORDER, params, token)
            .postRequest(new MyCallback() {
                @Override
                public void onSuccess(String res) {
                    CodeAndMsgResponse response = (CodeAndMsgResponse) deSerialize(res, CodeAndMsgResponse.class);
                    if (response == null) { // 如果为null，表示GSON反序列化失败(后台错误，且响应的是HTML错误页面)，因此我们可以直接认定为请求不成功；这里是因为该请求必须需要token验证，但是TOKEN解析失败了！因此需要进行重新登录，以获取TOKEN
                        requestSuccess = false; // 将请求设置为不成功的
                        jumpActivity(LoginActivity.class, false);
                        Log.e(TAG, res);
                        showToast("身份验证失败，请重新登录", 0, true);
                    } else if (response.getCode() == 401) {
                        jumpActivity(LoginActivity.class, true);
                        Log.e(TAG, res);
                        showToast("身份验证失败，请重新登录--401", 0, true);
                    } else if (response.getCode() == 500) {
                        Log.i(TAG, response.getMsg());
                        showToast("身份验证失败，请重新登录--500", 0, true);
                    } else if (response.getCode() == 200) {
                        Log.i(TAG, response.getMsg());
                        showToast("支付成功，本次消费：￥" + totalAccountmoney, 1, true);
                    }
                }
                @Override
                public void onFailure(Exception e) {
                    Log.e(TAG, "创建订单失败！");
                }
            },true);
    }

    /**
     * 该方法用来发起创建订单明细的请求
     * @param params
     */
    private void requestAddOrderList(Map<String, Object> params) {
        String token = (String) getSPFile("token", "");
        API.requestConfig(APIConfig.URL.CREATE_ORDER_LIST, params, token)
            .postRequest(new MyCallback() {
                @Override
                public void onSuccess(String res) {
                    CodeAndMsgResponse response = (CodeAndMsgResponse) deSerialize(res, CodeAndMsgResponse.class);
                    if (response == null) {
//                        jumpActivity(LoginActivity.class, true);
                        Log.e(TAG, res);
//                        showToast("身份验证失败，请重新登录--401", 0, true);
                    } else if (response.getCode() == 401) {
                        showToast("身份验证过期，请重新登录！", 0, true);
                        Log.i(TAG, response.getMsg());
                        jumpActivity(LoginActivity.class, true);
                    } else if (response.getCode() == 500) {
                        Log.i(TAG, response.getMsg());
                    } else if (response.getCode() == 200){
                        Log.i(TAG, response.getMsg());
                    }
                }

                @Override
                public void onFailure(Exception e) {
                    Log.e(TAG, "请求创建订单明细失败！");
                }
            }, true);
    }

    /**
     * 该方法用来发起更新商品信息的网络请求
     * @param params
     */
    private void requestUpdateGood(Map<String, Object> params) {
        String token = (String) getSPFile("token", "");
        API.requestConfig(APIConfig.URL.UPDATE_GOOD, params, token)
            .postRequest(new MyCallback() {
                @Override
                public void onSuccess(String res) {
                    CodeAndMsgResponse response = (CodeAndMsgResponse) deSerialize(res, CodeAndMsgResponse.class);
                    if (response == null) {
//                        jumpActivity(LoginActivity.class, true);
                        Log.e(TAG, res);
//                        showToast("身份验证失败，请重新登录--401", 0, true);
                    } else if (response.getCode() == 401) {
                        showToast("身份验证过期，请重新登录！", 0, true);
                        Log.i(TAG, response.getMsg());
                        jumpActivity(LoginActivity.class, true); // ·
                    } else if (response.getCode() == 500) {
                        Log.i(TAG, response.getMsg());
                    } else if (response.getCode() == 200){
                        Log.i(TAG, response.getMsg());
                    }
                }

                @Override
                public void onFailure(Exception e) {
                    Log.i(TAG, "请求修改商品失败！");
                }
            }, true);

    }

}
